/*
  学习目标：编程式跳转
  1. react做过处理，被Route包装过的组件，props上会有一个history属性
  常见的跳转方式：
  push,增加历史记录跳转
  replace,替换当前页面跳转
  goback,后退
  go(num),前进/后退多少步
*/
import React from 'react';
import './base.css';

// import { HashRouter as Router, Route, Link } from 'react-router-dom';
import {
  BrowserRouter as Router,
  Route,
  NavLink,
  Link,
  Switch,
  Redirect,
} from 'react-router-dom';
export default class App extends React.Component {
  render() {
    return (
      <>
        <Test></Test>
        <Router>
          <NavLink activeClassName="myActive" to="/" exact>
            首页
          </NavLink>
          <br />
          <NavLink activeClassName="myActive" to="/my">
            我的
          </NavLink>
          <br />
          <NavLink activeClassName="myActive" to="/friend">
            朋友
          </NavLink>

          {/* 1. 从上到下，匹配到的组件都会渲染出来 */}
          {/* <Route path="/" component={Home} exact></Route> */}
          {/* 匹配任意路径：1. 路径写/,不带精准匹配， */}
          {/* <Route path="/" component={Home}></Route> */}

          {/* 匹配任意路径：2. 不写path，这时候exact不再生效 */}

          {/* 使用Switch包裹住所有的 Route，那么匹配到一个后，就不会再匹配后面的内容了 */}
          <Switch>
            <Route path="/" component={Home} exact></Route>

            <Route path="/my" component={MyMusic}></Route>
            <Route path="/friend" component={Friend}></Route>

            {/* 404通配，一定要写在最后 */}
            <Route component={NotFound}></Route>
          </Switch>
        </Router>
      </>
    );
  }
}

// 没有被Route包裹的组件，props上没有 history 属性
function Test(props) {
  console.log('test-props -----> ', props);
  return <h1>我是普通组件-没有被Route包裹住</h1>;
}
// 被Route包装过的组件，props上会有一个history属性
function Home(props) {
  console.log('props -----> ', props);
  return (
    <h1>
      我是首页组件{' '}
      <button
        onClick={() => {
          // props.history.push('/friend');
          props.history.replace('/friend');
        }}
      >
        点我跳转
      </button>
      <button
        onClick={() => {
          // props.history.push('/friend');
          props.history.goBack();
        }}
      >
        点我后退
      </button>
      <button
        onClick={() => {
          // props.history.push('/friend');
          props.history.go(-2);
        }}
      >
        点我后退2步
      </button>
    </h1>
  );
}

function MyMusic() {
  return <h1>我是我的音乐组件</h1>;
}

function Friend() {
  return (
    <>
      <div>
        <Link to="/friend">朋友1</Link>
        <Link to="/friend/friend2">朋友2</Link>
        <Link to="/friend/friend3">朋友3</Link>
      </div>
      <Switch>
        {/* 1. 路径需要从父级开始写 */}
        <Route path="/friend/friend2" component={Friend2}></Route>
        <Route path="/friend/friend3" component={Friend3}></Route>
        {/* 2. 子路由需要默认显示，那么改成跟父级一样的路径，并且写在最后 */}
        <Route path="/friend" component={Friend1}></Route>
      </Switch>
    </>
  );
}

function Friend1() {
  return <h1>我是朋友-1</h1>;
}

function Friend2() {
  return <h1>我是朋友-2</h1>;
}

function Friend3() {
  return <h1>我是朋友-3</h1>;
}
function NotFound() {
  return <h1>我是404-NotFound</h1>;
}
